package br.com.toscano.contpedido.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Util {

	private static final String NOME_ARQUIVO_CONFIGURACAO = "demoiselle.properties";
	
	private static String dirCorrente;
	
	static {


		URL url = Util.class.getClassLoader().getResource(
				NOME_ARQUIVO_CONFIGURACAO);
		if (url != null) {
			dirCorrente = url.toString();
			if (dirCorrente.startsWith("file:\\")) { 
				dirCorrente = dirCorrente.substring("file:\\".length(), dirCorrente.length());
			}
			if (dirCorrente.startsWith("vfs:/")){
				dirCorrente = dirCorrente.substring("vfs:/".length(), dirCorrente.length());
			}
			try {
				if(dirCorrente.indexOf("WEB-INF") != -1) { 
					dirCorrente = dirCorrente.substring(0, dirCorrente.indexOf("WEB-INF"));
				}
				if(dirCorrente.endsWith("/")) { 
					dirCorrente = dirCorrente.substring(0, dirCorrente.length() - 1);
				}
				int local = dirCorrente.indexOf(":");
				if (local == -1) {
					// SE NAO TEM : É PQ EH LINUX
					dirCorrente = "/" + dirCorrente;
				}
			} catch (Exception e) {
			}
		} else {
			throw new RuntimeException("O caminho do arquivo de configuração principal do sistema não foi encontrado: " + NOME_ARQUIVO_CONFIGURACAO);
		}
	}
	
	  public static String formataValorParaStringCasaDecimaisSeExistir(BigDecimal bd, int quantidadeCasasDecimais){
		  
		  String retorno = "";
		  
		  double valor = bd.doubleValue();
		  if (valor % 1 > 0) {
			  retorno = formataValorParaString(bd, quantidadeCasasDecimais);;
		  } else {
			  retorno = formataValorParaString(new BigDecimal(bd.longValue()), 0);
		  }

		  return retorno;
	  }
	  
	  public static String formataValorParaString(BigDecimal bd, int quantidadeCasasDecimais){
		  bd = bd.setScale(quantidadeCasasDecimais,BigDecimal.ROUND_UP);
		  if (bd == null) {
			  return "";
		  }
		  if (quantidadeCasasDecimais == 0) {
			  java.text.DecimalFormat df = new java.text.DecimalFormat( "#,##0" );  
			  return df.format( bd );  
		  } else {
			  java.text.DecimalFormat df = new java.text.DecimalFormat( "#,##0.00" );  
			  return df.format( bd );  
		  }
	  }

	  
	  public static String dateToString(Date date) {
	      String formatado = "";
	      try {
	         SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	         formatado = sdf.format(date);

	      } catch (NullPointerException e) {          
	         return "";

	      } catch (Throwable e) {         
	      }
	      
	      return formatado;
	   } 
	  
	public static String dirCorrente() {
		if (dirCorrente.indexOf(NOME_ARQUIVO_CONFIGURACAO) != -1) {
			return dirCorrente.substring(0,dirCorrente.indexOf(NOME_ARQUIVO_CONFIGURACAO));
		} else {
			return dirCorrente;	
		}
	}
	
	public static String getUrlBase(HttpServletRequest req) {
		String protocolo = req.getProtocol();
		int i = protocolo.indexOf("/");
		if (i != -1) {
			protocolo = protocolo.substring(0, i);
		}
		int numeroPorta = req.getServerPort();
		String porta = "";
		if (numeroPorta != 80) {
			porta = ":" + numeroPorta;
		}
		return (protocolo + "://" + req.getServerName() + porta + req.getContextPath()).toLowerCase();
	}
	
	
	public static void downLoad(String filePath) throws IOException {
		FacesContext context = FacesContext.getCurrentInstance();
		HttpServletResponse response = (HttpServletResponse) context
				.getExternalContext().getResponse();
		File file = new File(Util.dirCorrente()+ "/relatorio/" +filePath);

        response.setHeader("Content-Disposition", "attachment;filename=\"" + file.getName() + "\""); //aki eu seto o header e o nome q vai aparecer na hr do donwload  
        response.setContentLength((int) file.length()); // O tamanho do arquivo  
        response.setContentType("application/vnd.ms-excel"); // e obviamente o tipo  
        
        if(file.toString().endsWith("xlsx") || file.toString().endsWith("xls") ){
            response.setContentType("application/vnd.ms-excel"); // e obviamente o tipo  
        } else if(file.toString().endsWith("pdf")){
            response.setContentType("application/pdf"); // e obviamente o tipo  
        }
  
        try {  
            FileInputStream in = new FileInputStream(file);  
            OutputStream out = response.getOutputStream();  
  
            byte[] buf = new byte[(int)file.length()];  
            int count;  
            while ((count = in.read(buf)) >= 0) {  
                out.write(buf, 0, count);  
            }  
            in.close();  
            out.flush();  
            out.close();  
            context.responseComplete();  
        } catch (IOException ex) {  
            System.out.println("Error in downloadFile: " + ex.getMessage());  
            ex.printStackTrace();  
        }  
	}


    /**
     * Valida data inicio fim.
     *
     * @return true, se data inicio menor que data Fim
     */
    public static boolean validaDataInicioMenorQueDataFim(Date dataInicio, Date dataFim)
    {
        boolean ok = false;
        if ((dataInicio == null) && (dataFim == null))
        {
            ok = false;
        }
        if ((dataInicio != null) && (dataFim != null))
        {
        	if (dataInicio.before(dataFim)){
                ok = true;
            }
        }
        return ok;
    }
    
	private static Calendar getCalendario(Date dt) {
		Calendar c = Calendar.getInstance();
		c.setTime(dt);
		return c;
	}


    /**
     * Adiciona qtd de dias a uma data.
     *
     */
    public static Date adicionaDiasData(Date data, int dias) {
    	Calendar c = getCalendario(data);
    	c.add(Calendar.DAY_OF_YEAR, dias);
    	
    	return c.getTime();
	}

    public static byte obterDiaSemana(){
		return (byte) Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
	}
    
    public static Date obterHojeSemHora(){
    	Calendar c = Calendar.getInstance();
    	c.set(Calendar.HOUR_OF_DAY, 0);
    	c.clear(Calendar.MINUTE);
    	c.clear(Calendar.SECOND);
    	c.clear(Calendar.MILLISECOND);
    	return c.getTime(); 
    }

    /**
     * Obtém a hora limite do dia, em precisão de milissegundos.
     */
    public static Date obterHoraLimiteHoje(){
    	return paraFimDoDia(new Date());
    }
    
    public static Date paraFimDoDia(Date date){
    	Calendar c = Calendar.getInstance();
    	c.setTime(date);
    	c.set(Calendar.HOUR_OF_DAY, 23);
    	c.set(Calendar.MINUTE, 59);
    	c.set(Calendar.SECOND, 59);
    	c.set(Calendar.MILLISECOND, 999);
    	return c.getTime(); 
    }
    
    public static Date paraInicioDoDia(Date date){
    	Calendar c = Calendar.getInstance();
    	c.setTime(date);
    	c.set(Calendar.HOUR_OF_DAY, 0);
    	c.set(Calendar.MINUTE, 0);
    	c.set(Calendar.SECOND, 0);
    	c.set(Calendar.MILLISECOND, 0);
    	return c.getTime(); 
    }
    
    public static boolean isUltimoDiaMes(Calendar cal){
    	return cal.get(Calendar.DAY_OF_MONTH) == cal.getActualMaximum(Calendar.DAY_OF_MONTH);
    }
    
    public static Date getUltimaData(Integer mes, Integer ano) {
    	if (mes == 12) {
    		mes = 1;
    		ano = ano + 1;
    	}
    	Date data = stringToDate(1+"/"+mes+"/"+ano);
    	adicionaDiasData(data, -1);

    	return data;
    }

	public static int contarSubString(String str, String subStr) {
		int count = 0;
		while (str.indexOf(subStr)>-1){
		    str = str.replaceFirst(subStr, "");
		    count++;
		}
		return count;
	}
    
  public  static Date stringToDate(String data) {
	  SimpleDateFormat formataData = new SimpleDateFormat("dd/MM/yyyy");
	  Date dataEntrada = null;
	  try { 
	      dataEntrada = formataData.parse(data);
	  } catch (ParseException ex) {
	      ex.printStackTrace();
	  }
	  
	  return dataEntrada;
   } 

}
